13590
11526
Véletlenül hibás fájlokat adtam át Gitnek, de még nem toltam el a szervert.
Hogyan lehet visszavonni ezeket a kötelezettségeket a helyi adattárból? 
1
2
3
Következő
Visszavonás és újrafelvétel
$ git sitout -m "Valami rettenetesen tévedett" # (0: A baleseted)
$ git reset HEAD ~ # (1)
<< szükség szerint szerkesztheti a fájlokat >> # (2)
$ git add. # (3)
$ git elkötelezettség -c ORIG_HEAD # (4)
Ez a parancs felel a visszavonásért. Visszavonja az utolsó elkötelezettséget, miközben érintetlenül hagyja a működő fát (a fájlok állapotát a lemezen). Újra hozzá kell adnia őket, mielőtt újra elkötelezheti őket).
Javításokat végez a működő fa fájlokban.
git adj hozzá mindent, amit be akarsz venni az új elköteleződésbe.
Végezze el a módosításokat, újból felhasználva a régi kötelezettség üzenetet. reset a régi fejet a .git / ORIG_HEAD fájlba másolta; elkötelezettség a -c segítségével Az ORIG_HEAD megnyit egy szerkesztőt, amely kezdetben tartalmazza a régi elkötelezettség naplóüzenetét és lehetővé teszi annak szerkesztését. Ha nem kell szerkesztenie az üzenetet, használhatja a -C opciót.
Alternatív megoldásként az előző kötelezettségvállalás (vagy csak annak végrehajtási üzenete) szerkesztéséhez a kötelezettség - amend változtatásokat ad az aktuális indexen belül az előző kötelezettségvállaláshoz.
A kiszolgálóra küldött elkötelezettség eltávolításához (nem visszaállításához) az előzmények átírása szükséges a git push origó master - erővel.
További irodalom
Hogyan helyezhetem vissza a HEAD egy korábbi helyre? (Leválasztott fej) és a Visszavonás elköveti
A fenti válasz megmutatja a git reflog-ot, amellyel meghatározhatja az SHA-1 értéket annak az elkötelezettségnek, amelyre vissza kíván térni. Miután megkapta ezt az értéket, használja a parancsok sorrendjét a fentiek szerint.
A HEAD ~ megegyezik a HEAD ~ 1-vel. A cikk Mi a feje gitben? hasznos, ha több elkötelezettséget akar visszavonni.
|
Az elkötelezettség visszavonása kissé ijesztő, ha nem tudja, hogyan működik. De valójában elképesztően könnyű, ha megérted. Megmutatom a kötelezettségvállalás visszavonásának 4 különböző módját.
1. opció: git reset --hard
Tegyük fel, hogy ez megvan, ahol C a HEAD és (F) a fájlok állapota.
(F)
ABC
↑
fő-
Szeretné elkötelezni a C elkötelezettségét, és soha többé nem látni, és elveszíteni a helyileg módosított fájlok összes változását. Te csinálod ezt:
git reset - kemény HEAD ~ 1
Az eredmény:
(F)
A-B
↑
fő-
Most B a FEJ. Mivel a --hard fájlt használta, a fájlok visszaállnak a B elkötelezettség állapotára.
2. opció: git reset
Ah, de tegyük fel, hogy a C elkövetése nem volt katasztrófa, de egy kicsit elmaradt. Vissza akarja vonni az elkötelezettséget, de a változtatásokat egy kis szerkesztés előtt megtartja, mielőtt jobban elkötelezné magát. Innentől kezdve, C-vel a fejeddel:
(F)
ABC
↑
fő-
Ezt megteheti, elhagyva a --keményt:
git reset HEAD ~ 1
Ebben az esetben az eredmény:
(F)
ABC
↑
fő-
Mindkét esetben a HEAD csak egy mutató a legutóbbi elkötelezettségre. Amikor elvégzi a git reset HEAD ~ 1 parancsot, megmondja Gitnek, hogy mozgassa a HEAD mutatót egy végrehajtással vissza. De (hacsak nem használod a --hard parancsot) a fájlokat úgy hagyod, ahogy voltak. Tehát most a git állapot megmutatja azokat a változásokat, amelyeket beírtál a C-be. Nem vesztettél el semmit!
3. opció: git reset --soft
A legkönnyebb érintés érdekében visszavonhatja az elkötelezettséget, de a fájlokat és az indexet elhagyhatja:
git reset - soft HEAD ~ 1
Ez nemcsak a fájljait hagyja békén, de még az indexét is magára hagyja. Amikor elvégzi a git állapotot, látni fogja, hogy ugyanazok a fájlok szerepelnek az indexben, mint korábban. Valójában a parancs után azonnal megteheti a git-elköteleződést, és ugyanazzal az elkötelezettséggel jár.
4. lehetőség: elvégezted a reset --hard fájlt, és vissza kellett szerezned a kódot
Még egy dolog: Tegyük fel, hogy elpusztítja az elkötelezettséget, mint az első példában, de aztán felfedezi, hogy mégis szüksége van rá? Kemény szerencse, igaz?
Nem, még mindig van mód a visszaszerzésre. Gépelje be a git reflog-ot, és megjelenik egy listája azokról a (részleges) elkötelezettségekről (azaz hashekról), amelyeken körbe költözött. Keresse meg a megsemmisített elkötelezettséget, és tegye ezt:
git checkout -b someNewBranchName shaYouDestroyed
Most feltámasztotta ezt az elkötelezettséget. A kötelezettségvállalások valójában 90 napig nem pusztulnak el Gitben, így általában visszamehet és megmenthet egyet, akitől nem akart megszabadulni.
|
Kétféleképpen lehet "visszavonni" az utolsó elkötelezettséget, attól függően, hogy nyilvánosságra hozta-e már az elkötelezettséget (a távoli adattárba tolta):
Hogyan lehet visszavonni a helyi elkötelezettséget
Tegyük fel, hogy helyben követtem el, de most el akarom távolítani ezt az elkötelezettséget.
git napló
elkövetni 101: rossz elkötelezettség # legújabb elkötelezettség. Ezt „HEAD” -nek hívnák.
100: jó elkötelezettség Ezt akarjuk.
Ahhoz, hogy mindent visszaállítsunk a legutóbbi elkötelezettség előtti állapotra, vissza kell állítanunk a HEAD előtti elkötelezettséget:
git reset --soft HEAD ^ # Használja a --soft alkalmazást, ha meg akarja tartani a változtatásokat
git reset --hard HEAD ^ # Használja a --hard alkalmazást, ha nem érdekli a végrehajtott változtatások megtartása
Most a git napló megmutatja, hogy az utolsó kötelezettségvállalásunkat eltávolították.
Hogyan lehet visszavonni a nyilvános elkötelezettséget
Ha már nyilvánosságra hozta a vállalásait, akkor létre kell hoznia egy új kötelezettségvállalást, amely "visszavonja" az előző kötelezettségvállalás során végrehajtott változtatásokat (jelenlegi HEAD).
git revert HEAD
A változtatások most visszavonásra kerülnekés készen áll arra, hogy elkötelezze magát:
git comm -m 'a véletlenül eltávolított fájl helyreállítása'
git napló
102-es kötelezettségvállalás: a véletlenül eltávolított fájl helyreállítása
101-es kötelezettségvállalás: nem szükséges fájl eltávolítása
elkövetni 100: egy szükséges fájl hozzáadása
További információkért tekintse meg a Git Basics - A dolgok visszavonása című cikket.
|
Fájlok hozzáadása / eltávolítása a dolgok tetszés szerinti megszerzéséhez:
git rm classdir
git hozzá forrást
Ezután módosítsa a kötelezettségvállalást:
git elkövetni - javítani
A korábbi, téves kötelezettségvállalást az új indexállapot tükrében szerkesztjük - más szóval olyan lesz, mintha soha nem követte volna el hibát.
Ne feledje, hogy ezt csak akkor szabad megtennie, ha még nem nyomta meg. Ha nyomott, akkor csak normálisan kell végrehajtania a javítást.
|
git rm fájljaid / *. osztály
git pühend -a -m "törölte az összes osztályfájlt a" saját fájljai "mappából"
vagy
git reset - kemény HEAD ~ 1
Figyelem: A fenti parancs véglegesen eltávolítja a .java fájlok (és minden más fájl) módosításait, amelyeket el akart végezni.
A HEAD-1-re történő visszaállításkor a munkamásolat a hibás elkövetés előtti állapotra áll.
|
Az utolsó elkötelezettség megváltoztatásához
Cserélje ki a fájlokat az indexben:
git rm - gyorsítótár * .osztály
git add * .java
Ezután, ha magán fióktelepről van szó, módosítsa a kötelezettségvállalást:
git elkövetni - javítani
Vagy ha megosztott fiókról van szó, tegyen új kötelezettséget:
git comm -m 'A .class fájlok cseréje .java fájlokra'
(Egy korábbi elkötelezettség megváltoztatásához használja a fantasztikus interaktív újraindítást.)
ProTip ™: A * .class hozzáadása egy gitignore-hoz, hogy ez ismét ne álljon le.
Visszavonni egy kötelezettségvállalást
Az elkötelezettség módosítása az ideális megoldás, ha módosítania kell az utolsó elkötelezettséget, de egy általánosabb megoldás visszaáll.
Visszaállíthatja Git-t bármilyen elkötelezettségre a következőkkel:
git reset @ ~ N
Ahol N a HEAD előtti végrehajtások száma, és @ ~ visszaáll az előző kötelezettségre.
Tehát a kötelezettségvállalás módosítása helyett használhatja:
git reset @ ~
git add * .java
git pühend -m ".java fájlok hozzáadása"
Nézze meg a git súgó visszaállítását, különös tekintettel a --soft --mixed és --hard szakaszokra, hogy jobban megértse, mit csinál ez.
Reflog
Ha elrontod, mindig használhatod a reflogot az elvetett elkövetések megkeresésére:
$ git reset @ ~
$ git reflog
c4f708b HEAD @ {0}: reset: lépés a ~ ~ -ra
2c52489 HEAD @ {1}: kötelezettség: hozzáadott néhány .class fájlt
$ git reset 2c52489
... és visszatérsz oda, ahol elkezdted
|
Használja a git revert  parancsot.
A végrehajtási azonosító megszerzéséhez használja a git naplót.
|
Ha egy helyi kötelezettségvállalás teljes visszavonását tervezi, bármit is változtasson az elkötelezettségen, és ha ettől semmit sem aggaszt, hajtsa végre a következő parancsot.
git reset --hard HEAD ^ 1
(Ez a parancs figyelmen kívül hagyja a teljes elkötelezettséget, és a módosítások teljesen elvesznek a helyi működő fából). Ha vissza akarja vonni az elkötelezettséget, de a változtatásokat az átmeneti területen szeretné végrehajtani (mielőtt elkötelezné magát, mint a git add után), akkor hajtsa végre a következő parancsot.
git reset - soft HEAD ^ 1
Most az elkötelezett fájlok az állomás területére kerülnek. Tegyük fel, hogy ha fel akarja állítani a fájlokat, mert rossz tartalmat kell szerkesztenie, akkor hajtsa végre a következő parancsot
git reset HEAD
Most elkötelezett fájlok érkeznek a szakaszos területről a nem rendezett területre. Most a fájlok készen állnak a szerkesztésre, így bármit is változtat, szerkeszteni kívánja, hozzáadta és új / új elköteleződést hajt végre.
Tovább (link megszakadt) (Archivált változat)
|
Ha telepítve van a Git Extras szolgáltatás, a git undo futtatásával visszavonhatja a legújabb elkötelezettséget. A git undo 3 visszavonja az utolsó három elkötelezettséget.
|
Szerettem volna visszavonni a legfrissebb öt elkötelezettséget megosztott tárunkban. Utánanéztem a revízióazonosítónak, amelyet vissza akartam állítani. Aztán beírtam a következőket.
prompt> git reset - kemény 5a7404742c85
A HEAD címe: 5a74047. Hozzáadott még egy oldalt a katalógushoz
prompt> git push origó master - erő
Összesen 0 (delta 0), újrafelhasználva 0 (delta 0)
távoli: bb / acl: neoneye megengedett. elfogadott hasznos teher.
A git@bitbucket.org címre: thecompany / prometheus.git
+ 09a6480 ... 5a74047 master -> master (kényszerített frissítés)
prompt>
|
Inkább a git rebase -i-t használom ehhez a munkához, mert felbukkan egy szép lista, ahol kiválaszthatom azokat a vállalásokat, amelyektől megszabadulok. Lehet, hogy ez nem olyan közvetlen, mint néhány más válasz itt, de csak jól érzi magát.
Válassza ki, hány elkötelezettséget szeretne felsorolni, majd hívjon így (az utolsó három felvételéhez)
git rebase -i FEJ ~ 3
Minta lista
válasszon aa28ba7 Sanity checket az RtmpSrv porthoz
válassza a c26c541 RtmpSrv verzió opciót
pick 58d6909 Jobb URL dekódolási támogatás
Ezután a Git eltávolítja az összes eltávolított sor végrehajtását.
|
Hogyan javítható az előző helyi kötelezettségvállalás
Használja a git-gui-t (vagy hasonlót) a git -amend végrehajtásához. A grafikus felhasználói felületről hozzáadhat vagy eltávolíthat egyes fájlokat a véglegesítésből. Módosíthatja az elkövetési üzenetet is.
Az előző helyi kötelezettségvállalás visszavonása
Csak állítsa vissza az ágat az előző helyre (például a gitk vagy a git rebase használatával). Ezután alkalmazza a változtatásokat egy mentett példányból. A helyi adattárban lévő szemétgyűjtés után olyan lesz, mintha a nem kívánt elkövetés soha nem történt volna meg. Ha mindezt egyetlen parancsban szeretné megtenni, használja a git reset HEAD ~ 1 parancsot.
Szófigyelmeztetés: A git reset gondatlan használata jó módja annak, hogy munkamásolata zavaros állapotba kerüljön. Azt javaslom, hogy a Git újoncok ezt kerüljék, ha tehetik.
Hogyan lehet visszavonni a nyilvános elkötelezettséget
A módosítások visszavonásához végezzen fordított cseresznyeválasztást (git-revert).
Ha még nem vont be más változtatásokat a fiókjába, egyszerűen megteheti ...
git revert --no-edit HEAD
Ezután tolja a frissített fiókot a megosztott tárba.
Az elkövetési előzmények mindkét elkötelezettséget külön-külön mutatják.
Haladó: A nyilvános adattár magán fiókjának javítása
Ez veszélyes lehet - győződjön meg arról, hogy van-e a fiók helyi példánya, amelyet újra el kell dobnia.
Megjegyzés: Nem akarja ezt megtenni, ha esetleg valaki más dolgozik a fióktelepen.
git push --delete (branch_name) ## az ág nyilvános verziójának eltávolítása
Tisztítsa meg fióktelepét helyben, majd tegye vissza ...
git push origó (branch_name)
Normális esetben valószínűleg nem kell attól tartania, hogy a magánszektor elkötelezettségének története tiszta. Csak nyomja meg a nyomon követési elkötelezettséget (lásd fentebb a „Hogyan lehet visszavonni a nyilvános elkötelezettséget” című részt), majd később végezzen el egy squash-egyesítést az előzmények elrejtése érdekében.
|
Ha véglegesen vissza akarja vonni, és klónozott néhány adattárat
Az elkötelezett azonosító látható
git napló
Akkor megteheti -
git reset --hard 
git push origó  -f
|
Ha ócskát követett el, de nem tolta el,
git reset - soft HEAD ~ 1
A HEAD ~ 1 rövidítés a feje előtti elköteleződéshez. Alternatív megoldásként hivatkozhat a kivonat SHA-1-re, ha vissza akar állni erre. A --soft opció törli az elkötelezettséget, de az összes megváltoztatott fájlt a "Végrehajtandó változtatások" maradja meg, ahogyan a git állapot megfogalmazza.
Ha meg akarsz szabadulni a munkafában a nyomon követett fájlokban bekövetkezett változásoktól, mióta a fejléc előtt végrehajtott művelet a "--hard" szót használja.
VAGY
Ha már nyomott, és valaki húzott, ami általában az én esetem, akkor nem használhatja a git reset-et. Mindazonáltal elvégezhet egy visszaváltást,
git revert HEAD
Ez új kötelezettségvállalást hoz létre, amely megfordítja a véletlenszerű elkövetés által bevezetett mindent.
|
A SourceTree-n (a GitHub GUI-ján) kattintson a jobb gombbal az elkötelezettségre, és hajtson végre egy „Reverse Commit” műveletet. Ezzel visszavonhatja a módosításokat.
A terminálon:
Alternatív megoldásként használhatja:
git vissza
Vagy:
git reset --soft HEAD ^ # Használja a --soft alkalmazást, ha meg akarja tartani a változtatásokat.
git reset --hard HEAD ^ # Használja a --hard alkalmazást, ha nem érdekli a változtatások megtartása.
|
Egyetlen parancs:
git reset - soft 'HEAD ^'
Remekül működik az utolsó helyi elkötelezettség visszavonása!
|
Csak állítsa vissza az alábbi parancs végrehajtásával a git használatával:
git reset - soft HEAD ~ 1
Magyarázza el: mit csinál a git reset, alapvetően visszaáll minden olyan elkötelezettségre, amelyhez vissza szeretne térni, majd ha a --soft kulccsal kombinálja, akkor visszamegy, de megtartja a fájl (ok) változásait, tehát visszatér arra a szakaszra, amelyet a fájl éppen hozzáadott, a HEAD az ág feje, és ha ~ 1-gyel kombinálod (ebben az esetben a HEAD ^ -et is használod), akkor csak egy visszavonást hajt végre, amire vágysz. ..
Az alábbi kép lépéseit részletesebben elkészítem az Ön számára, beleértve a valós helyzetekben előforduló összes lépést és a kód végrehajtását:
|
Hogyan lehet visszavonni az utolsó Git elkövetést?
Ahhoz, hogy mindent vissza lehessen állítani a legutóbbi elkötelezettség előtti állapotra, vissza kell állítanunk a HEAD előtti elkötelezettséget.
Ha nem akarja megtartani a végrehajtott módosításokat:
git reset --hard HEAD ^
Ha meg szeretné tartani a változtatásokat:
git reset - soft HEAD ^
Most ellenőrizze a git naplóját. Ez megmutatja, hogy az utolsó kötelezettségvállalásunkat eltávolították.
|
"A működő fa visszaállítása az utolsó elkötelezettségre"
git reset --hard HEAD ^
"Távolítsa el az ismeretlen fájlokat a működő fáról"
git tiszta
lásd - Git Quick Reference
MEGJEGYZÉS: Ez a parancs törli az előző elkötelezettséget, ezért óvatosan használja! git reset - a hard biztonságosabb.
|
Használja a reflogot a helyes állapot megtalálásához
git reflog
TÖRLÉS FELTÉTELE ELŐTT
Válassza ki a megfelelő reflogot (esetemben f3cb6e2) és írja be
git reset - kemény f3cb6e2
Ezt követően a repo HEAD visszaáll erre a HEADidre
NAPLÓ VISSZAÁLLÍTÁS UTÁN
Végül a reflog úgy néz ki, mint az alábbi kép
REFLOG FINAL
|
Első futás:
git reflog
Megmutatja az összes lehetséges műveletet, amelyet a tárában végrehajtott, például elkötelezettség, egyesítés, húzás stb.
Akkor csináld:
git reset --hard ActionIdFromRefLog
|
Utolsó kötelezettség visszavonása:
git reset --soft HEAD ^ vagy git reset --soft HEAD ~
Ez visszavonja az utolsó elkötelezettséget.
Itt a - soft azt jelenti, hogy visszaáll az átállásra.
A HEAD ~ vagy a HEAD ^ azt jelenti, hogy elmozdulunk a HEAD elé.
Az utolsó kötelezettségvállalás cseréje új kötelezettségvállalásra:
git elkövetés --amend -m "üzenet"
Ez helyettesíti az utolsó kötelezettségvállalást az új kötelezettségvállalással.
|
Egy másik módja:
Ellenőrizze a visszaállítani kívánt fiókot, majd állítsa vissza a helyi munkamásolatot arra az elkötelezettségre, hogy a legfrissebbnek szeretné lenni a távoli kiszolgálót (minden, miután el fog látni). Ehhez kattintson a jobb egérgombbal a SourceTree-ben a kiválasztott "BRANCHNAME visszaállítása erre az elkötelezettségre" elemre.
Ezután keresse meg az adattár helyi könyvtárát, és futtassa ezt a parancsot:
git -c diff.mnemonicprefix = hamis -c mag.quotepath = hamis lökés -v -f --címkék REPOSITORY_NAMEBRANCHNAME: BRANCHNAME
Ez törli az összes elkötelezettséget az aktuális után a helyi adattárban, de csak azt az egy ágat.
|
Gépelje be a git naplót, keresse meg az utolsó végrehajtási kivonat kódot, majd írja be:
git reset 
|
Esetemben véletlenül elkövettem néhány fájlt, amit nem akartam. Tehát a következőket tettem és működött:
git reset - soft HEAD ^
git rm - gyorsítótárazott [nincs szükséged fájlokra]
git add [szükséges fájlok]
git elkövetés -c ORIG_HEAD
Ellenőrizze az eredményeket a gitk vagy a git log --stat paranccsal
|
Egyszerű, futtassa ezt a parancssorában:
git reset - soft HEAD ~
|
Két fő forgatókönyv van
Még nem tolta el az elkötelezettséget
Ha a probléma extra fájlokat okozott (és nem szeretné, hogy azok legyenek a tárban), akkor eltávolíthatja őket a git rm használatával, majd a --amend paranccsal
git rm 
A teljes könyvtárakat eltávolíthatja az -r gombbal, vagy akár kombinálhatja más Bash parancsokkal is
git rm -r 
git rm $ (find -name '* .class')
A fájlok eltávolítása után elkötelezheti magát a --amend paranccsal
git pühend --amend -C HEAD # - a -C opció ugyanaz az elkötelezett üzenet használata
Ez felülírja a legutóbbi helyi elkötelezettséget az extra fájlok eltávolításával, így ezeket a fájlokat soha nem küldjük el push-ban, és a GC eltávolítja őket a helyi .git adattárból.
Már el is nyomta az elkötelezettséget
Alkalmazhatja ugyanazt a megoldást a másik szcenáriónál, majd végezze el a git push alkalmazást az -f kapcsolóval, de ez nem ajánlott, mivel a távoli előzményeket eltérõ változtatással írja felül (megzavarhatja az adattárat).
Ehelyett a --amend nélkül kell végrehajtanod az elköteleződést (ne felejtsd el ezt az -amend`ről: Ez az opció átírja a legutóbbi elkötelezettség előzményeit).
|
Helyi elkötelezettségért
git reset - soft HEAD ~ 1
vagy ha nem emlékszik pontosan melyik elkötelezettségre, akkor használhatja
git rm - gyorsítótárazott 
Tolt elkötelezettségért
A fájlok eltávolításának megfelelő módja a tárház előzményeiből a git filter-branch használata. Vagyis
git filter-branch - index-filter 'git rm --cached ' HEAD
De azt javaslom, hogy óvatosan használja ezt a parancsot. További információt a git-filter-branch (1) kézi oldalon talál.
|
Az előző verzióra való visszaállításhoz véglegesen törölje az összes nem végrehajtott módosítást:
git reset - kemény HEAD ~ 1
|
MI HASZNÁLHATÓ, reset - soft vagy reset - hard?
Két centet teszek hozzá @ Kyralessa válaszához:
Ha nem biztos abban, hogy mit használjon, akkor menjen - soft (ezt az egyezményt arra használtam, hogy emlékezzem rá - soft for safe).
Miért ?
Ha véletlenül a --hard lehetőséget választja, akkor elveszíti a változtatásokat, mint korábban.
Ha véletlenül a --soft lehetőséget választja, további parancsok alkalmazásával elérheti a --hard azonos eredményeit
git reset HEAD file.html
git checkout - file.html
Teljes példa
echo "some changes ..."> file.html
git add file.html
git elkötelezettség -m "helytelen elkövetés"
# Vissza kell állítanom
git reset - kemény HEAD ~ 1 (a változtatások törlése)
# VAGY
git reset - soft HEAD ~ 1 # Vissza a színpadra
git visszaállítja a HEAD file.html # vissza a működő könyvtárba
git checkout - file.html # a változtatások törlése
A krediteket @Kyralessa kapja.
|
1
2
3
Következő
Nagyon aktív kérdés. Nyerjen 10 hírnevet a kérdés megválaszolásához. A jó hírnév követelménye megvédi ezt a kérdést a spamektől és a nem válaszolóktól.
Nem a keresett válasz? Böngésszen a git verzió-vezérlő git-engelt visszavonás vagy saját kérdés feltüntetésével.